package com.hualan.bean;

import com.hualan.util.Utils;

import java.util.*;

public class AddressBook {
    /**
     * 电话簿
     * L
     *   鲁迅 130xxx
     *   李清照 23344
     * M
     *   马云
     *   梦泽其
     */
    Map<Character, TreeSet<Contact>> map = new TreeMap<>();

    //临时联系人变量
    Contact contactTemp;

    public AddressBook() {
        TreeSet<Contact> t1 = new TreeSet<>();
        t1.add(new Contact("鲁迅","13700"));
        t1.add(new Contact("李清照","23344"));
        map.put('L',t1);
    }

    /**
     * 根据手机号关键字查找
     * @param phoneKeyword
     */
    public void showContactsByPhone(String phoneKeyword){
        //假如找不到
        boolean have = false;
        //获取所有key
        Set<Character> keySet = map.keySet();
        for (Character key : keySet) {
            //获得key分组下的所有联系人
            Set<Contact> contactSet = map.get(key);
            for (Contact contact :contactSet) {
                if(contact.getPhone().contains(phoneKeyword)){
                    //匹配成功
                    have = true;
                    System.out.println("\t"+contact);
                }
            }
        }
        //遍历结束
        if(!have){
            System.out.println("\t没有符合条件的联系人！");
        }
    }

    /**
     * 修改联系人
     * 删除 + 添加
     * @param name 旧数据
     * @param c 新数据
     * @return
     *
     * 张三  110
     * 张三  111
     *
     * 张三  110
     * 李四  111
     *
     * 李四 666
     */
    public boolean modifyContact(String name, Contact c){
        if(!deleteContactByName(name)){
            System.out.println("联系人不存在");
            return false;
        }
        //联系人存在，添加新的
        if(addContact(c)){
            return true;
        }else {
            addContact(contactTemp);
            System.out.println("新联系人已存在");
            return false;
        }

    }

    /**
     * 根据名字删除联系人
     * @param name 待删除名字
     * @return
     */
    public boolean deleteContactByName(String name){
        //获取分组名
        Character groupName = Utils.getChar0(name);
        Set<Contact> set = map.get(groupName);
        if(set==null){
            System.out.println("联系人不存在！");
            return false;
        }
        Iterator<Contact> it = set.iterator();
        while (it.hasNext()){
            //临时保存联系人
            contactTemp = it.next();
            if(contactTemp.getName().equals(name)){
                //删除确认
                System.out.print("确定要删除吗(y是/n否)：");
                if(Utils.getYn().equals("Y")){
                    //数据删除
                    it.remove();
                    //分组是否空
                    if(set.size()==0){
                        //分组为空
                        map.remove(groupName);
                    }
                    return true;
                }
                return false;

            }
        }
        System.out.println("联系人不存在！");
        return false;
    }

    /**
     * 根据分组查看联系人
     */
    public void showContactsByGroupName(String groupName){
        Character _groupName = groupName.toUpperCase().charAt(0);
        Set<Contact> contactSet = map.get(_groupName);
        if(contactSet==null){
            System.out.println("此分组不存在，没有数据！");
            return;
        }
        //有
        System.out.println(_groupName);
        for (Contact contact : contactSet) {
            System.out.println("\t"+contact);
        }
    }

    /**
     * 查看全部联系人
     */
    public void showAllContacts(){
        if(map.size()==0){
            System.out.println("没有联系人，添加后重试！");
            return;
        }
//        System.out.println(map);
        //有
        Set<Character> keySet = map.keySet();
        for (Character groupName: keySet) {
            //打印分组名
            System.out.println(groupName);
            //获取联系人set表
            Set<Contact> contactSet = map.get(groupName);
            for (Contact contact : contactSet) {
                System.out.println("\t"+contact);
            }
        }
    }

    /**
     * 添加联系人，名字不许重复
     * @param c 新的联系人对象
     * @return true成功。false失败
     */
    public boolean addContact(Contact c){
        //获取分组名
        Character groupName = c.getGroupName();
        //取出对应分组的set集合
        TreeSet<Contact> set = map.get(groupName);
        if(set==null){
            //分组不存在
            set = new TreeSet<>();
            //新创建的分组，挂载到map上
            map.put(groupName,set);
        }
        //分组肯定存在
//        System.out.println(c);
        return set.add(c);
    }
}
